reviewed by: Richard Hult
authorSven Herzberg <sven@imendio.com>
Sun, 20 Jul 2008 19:22:37 +0000 (19:22 +0000)
committerSven Herzberg <herzi@src.gnome.org>
Sun, 20 Jul 2008 19:22:37 +0000 (19:22 +0000)
2008-07-20  Sven Herzberg  <sven@imendio.com>

reviewed by: Richard Hult

Fixes #543868: GdkPixmap is upside down on quartz

* gdk/quartz/gdkdrawable-quartz.c (gdk_quartz_draw_drawable): flip the
coordinate space from GTK+ orientation to CoreGraphics orientation
before calling CoreGraphics code
* gdk/quartz/gdkgc-quartz.c (gdk_quartz_draw_tiled_pattern): drop the
coordinate space flipping (we always get it right, now)
* gdk/quartz/gdkpixmap-quartz.c
(gdk_pixmap_impl_quartz_get_context): flip the coordinate space when
creating the CGContextRef

svn path=/trunk/; revision=20870

ChangeLog
gdk/quartz/gdkdrawable-quartz.c
gdk/quartz/gdkgc-quartz.c
gdk/quartz/gdkpixmap-quartz.c

index cf0a1f4c1178d9d887541cab9b014f98c7265de9..3bf4a3216b1a6199655cd718e2121415091dda3b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2008-07-20  Sven Herzberg  <sven@imendio.com>
+
+       reviewed by: Richard Hult
+
+       Fixes #543868: GdkPixmap is upside down on quartz
+
+       * gdk/quartz/gdkdrawable-quartz.c (gdk_quartz_draw_drawable): flip the
+       coordinate space from GTK+ orientation to CoreGraphics orientation
+       before calling CoreGraphics code
+       * gdk/quartz/gdkgc-quartz.c (gdk_quartz_draw_tiled_pattern): drop the
+       coordinate space flipping (we always get it right, now)
+       * gdk/quartz/gdkpixmap-quartz.c
+       (gdk_pixmap_impl_quartz_get_context): flip the coordinate space when
+       creating the CGContextRef
+
 2008-07-20  Sven Herzberg  <sven@imendio.com>
 
        reviewed by: Richard Hult
index abf2916fc97c57cccfce3c1ec6a83066c3e0223e..ec0cf6c74622288244cb0290f67ce56afc49e175 100644 (file)
@@ -337,6 +337,7 @@ gdk_quartz_draw_drawable (GdkDrawable *drawable,
   else if (dest_depth != 0 && src_depth == dest_depth)
     {
       CGContextRef context = gdk_quartz_drawable_get_context (drawable, FALSE);
+      gint width, height;
 
       if (!context)
        return;
@@ -344,6 +345,13 @@ gdk_quartz_draw_drawable (GdkDrawable *drawable,
       _gdk_quartz_gc_update_cg_context (gc, drawable, context,
                                        GDK_QUARTZ_CONTEXT_STROKE);
 
+      CGContextSaveGState (context);
+
+      /* convert coordinates from gtk+ to core graphics */
+      gdk_drawable_get_size (drawable, &width, &height);
+      CGContextTranslateCTM (context, 0, height);
+      CGContextScaleCTM (context, 1.0, -1.0);
+
       CGContextClipToRect (context, CGRectMake (xdest, ydest, width, height));
       CGContextTranslateCTM (context, xdest - xsrc, ydest - ysrc);
       CGContextDrawImage (context, 
@@ -352,6 +360,8 @@ gdk_quartz_draw_drawable (GdkDrawable *drawable,
                                     GDK_PIXMAP_IMPL_QUARTZ (src_impl)->height), 
                          GDK_PIXMAP_IMPL_QUARTZ (src_impl)->image);
 
+      CGContextRestoreGState (context);
+
       gdk_quartz_drawable_release_context (drawable, context);
     }
   else
index 601e62ede1e780ed75872d5db6b9b9f3f06cfdd8..ea773791012472ee2cd4bbac6751526b1cd744b9 100644 (file)
@@ -290,12 +290,6 @@ gdk_quartz_draw_tiled_pattern (void         *info,
   width = CGImageGetWidth (pattern_image);
   height = CGImageGetHeight (pattern_image);
 
-  if (private->is_window)
-    {
-      CGContextTranslateCTM (context, 0, height);
-      CGContextScaleCTM (context, 1.0, -1.0);
-    }
-
   CGContextDrawImage (context, 
                      CGRectMake (0, 0, width, height),
                      pattern_image);
index 62f04184613a4c4ff2aac69683ca8dbbb93e1c3d..e55ff9d1aa5226a00f77b1df3d5884c3c9db9deb 100644 (file)
@@ -47,6 +47,7 @@ gdk_pixmap_impl_quartz_get_context (GdkDrawable *drawable,
 {
   GdkPixmapImplQuartz *impl = GDK_PIXMAP_IMPL_QUARTZ (drawable);
   CGContextRef cg_context;
+  size_t height;
 
   cg_context = CGBitmapContextCreate (impl->data,
                                       CGImageGetWidth (impl->image),
@@ -57,6 +58,12 @@ gdk_pixmap_impl_quartz_get_context (GdkDrawable *drawable,
                                       CGImageGetBitmapInfo (impl->image));
   CGContextSetAllowsAntialiasing (cg_context, antialias);
 
+  /* convert coordinates from core graphics to gtk+ */
+  height = CGImageGetHeight (impl->image);
+
+  CGContextTranslateCTM (cg_context, 0, height);
+  CGContextScaleCTM (cg_context, 1.0, -1.0);
+
   return cg_context;
 }